import { LangType, LocaleLangType } from '@/stores/types'
import { createI18n, I18n } from 'vue-i18n'

// 按需加载自定义的语言包
const loadLangModule = async (locale: LangType): Promise<Record<string, any>> => {
    // 自定义的语言包
    const itemize: Record<string, any> = {}
    // 按需加载语言包文件
    const module: Record<string, any> = locale === 'zh-cn' ? await import('./modules/zh-cn.json') : await import('./modules/en.json')
    // 对自动引入ts的 module 进行整理
    // for (const path in module) {
    //     if (itemize[locale]) {
    //         itemize[locale].push(module[path])
    //     } else {
    //         itemize[locale] = module[path]
    //     }
    // }
    // 对自动引入json的 module 进行整理
    itemize[locale] = module
    return itemize
}

// 按需加载element plus语言包
const loadElementLangModule = async (locale: LangType): Promise<Record<string, any>> => {
    return locale === 'zh-cn' ? await import('element-plus/es/locale/lang/zh-cn') : await import('element-plus/es/locale/lang/en')
}

// 合并 messages
const mergeMessages = (module: Record<string, any>, element: Record<string, any>, locale: LangType) => {
    // 最终的message
    const messages: Record<string, any> = {}
    // 合并语言包
    const currentMessage = Object.assign({}, module[locale])
    // 处理最终格式
    messages[locale] = { name: locale, el: element.default.el, ...currentMessage }
    return messages
}

// 按需载入并处理语言包
const loadLang = async (): Promise<Record<string, any>> => {
    // 存在则获得，不存在则默认使用 zh-cn
    const locale = lang ? lang.defaultLang : 'zh-cn'
    // 按需加载自定义的语言包
    const module: Record<string, any> = await loadLangModule(locale)
    // 按需加载element plus语言包
    const element: Record<string, any> = await loadElementLangModule(locale)
    // 合并 messages
    return mergeMessages(module, element, locale)
}

// 从本地获得默认语言
const getLocaleLang = (): LocaleLangType => {
    const config = localStorage.getItem(STORE_CONFIG)
    return config ? JSON.parse(config).lang : null
}

// 默认语言
const lang: LocaleLangType = getLocaleLang()
// 最终的消息
let messages: Record<string, any> = await loadLang()

// 创建i18n实例并引入语言文件
const i18n: I18n = createI18n({
    legacy: false,
    globalInjection: true, // 挂载$t, $d等到全局
    locale: lang?.defaultLang ?? 'zh-cn', // 语言标识（缓存里面没有就用中文）
    fallbackLocale: lang?.fallbackLang ?? 'en', //没有中文的时候就用英文
    messages,
})

export default i18n
